#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Matplotlib 基础绘图示例
演示Matplotlib的核心绘图功能和基本用法
"""

import matplotlib.pyplot as plt
import numpy as np

# 设置中文字体，解决中文显示问题
plt.rcParams['font.sans-serif'] = ['SimHei', 'Arial Unicode MS', 'DejaVu Sans']
plt.rcParams['axes.unicode_minus'] = False

def line_plot_examples():
    """线图示例"""
    print("=== 线图示例 ===")
    
    # 生成数据
    x = np.linspace(0, 2*np.pi, 100)
    y1 = np.sin(x)
    y2 = np.cos(x)
    y3 = np.sin(x + np.pi/4)
    
    plt.figure(figsize=(12, 8))
    
    # 子图1: 基本线图
    plt.subplot(2, 2, 1)
    plt.plot(x, y1, label='sin(x)', color='blue', linewidth=2)
    plt.plot(x, y2, label='cos(x)', color='red', linewidth=2)
    plt.title('基本线图')
    plt.xlabel('x')
    plt.ylabel('y')
    plt.legend()
    plt.grid(True, alpha=0.3)
    
    # 子图2: 不同线型
    plt.subplot(2, 2, 2)
    plt.plot(x, y1, '-', label='实线', linewidth=2)
    plt.plot(x, y2, '--', label='虚线', linewidth=2)
    plt.plot(x, y3, '-.', label='点划线', linewidth=2)
    plt.title('不同线型')
    plt.xlabel('x')
    plt.ylabel('y')
    plt.legend()
    plt.grid(True, alpha=0.3)
    
    # 子图3: 带标记的线图
    x_sparse = np.linspace(0, 2*np.pi, 20)
    y1_sparse = np.sin(x_sparse)
    y2_sparse = np.cos(x_sparse)
    
    plt.subplot(2, 2, 3)
    plt.plot(x_sparse, y1_sparse, 'o-', label='sin(x)', markersize=6)
    plt.plot(x_sparse, y2_sparse, 's--', label='cos(x)', markersize=6)
    plt.title('带标记的线图')
    plt.xlabel('x')
    plt.ylabel('y')
    plt.legend()
    plt.grid(True, alpha=0.3)
    
    # 子图4: 多种颜色
    plt.subplot(2, 2, 4)
    colors = ['red', 'green', 'blue', 'orange', 'purple']
    for i, color in enumerate(colors):
        y = np.sin(x + i*np.pi/6)
        plt.plot(x, y, color=color, label=f'sin(x+{i}π/6)', linewidth=2)
    plt.title('多种颜色')
    plt.xlabel('x')
    plt.ylabel('y')
    plt.legend()
    plt.grid(True, alpha=0.3)
    
    plt.tight_layout()
    plt.show()

def scatter_plot_examples():
    """散点图示例"""
    print("=== 散点图示例 ===")
    
    plt.figure(figsize=(12, 8))
    
    # 子图1: 基本散点图
    np.random.seed(42)
    n = 100
    x1 = np.random.randn(n)
    y1 = np.random.randn(n)
    
    plt.subplot(2, 2, 1)
    plt.scatter(x1, y1, alpha=0.7)
    plt.title('基本散点图')
    plt.xlabel('x')
    plt.ylabel('y')
    plt.grid(True, alpha=0.3)
    
    # 子图2: 颜色映射散点图
    x2 = np.random.randn(n)
    y2 = np.random.randn(n)
    colors = np.random.rand(n)
    
    plt.subplot(2, 2, 2)
    scatter = plt.scatter(x2, y2, c=colors, alpha=0.7, cmap='viridis')
    plt.colorbar(scatter)
    plt.title('颜色映射散点图')
    plt.xlabel('x')
    plt.ylabel('y')
    plt.grid(True, alpha=0.3)
    
    # 子图3: 大小映射散点图
    x3 = np.random.randn(n)
    y3 = np.random.randn(n)
    sizes = 1000 * np.random.rand(n)
    
    plt.subplot(2, 2, 3)
    plt.scatter(x3, y3, s=sizes, alpha=0.5, c='red')
    plt.title('大小映射散点图')
    plt.xlabel('x')
    plt.ylabel('y')
    plt.grid(True, alpha=0.3)
    
    # 子图4: 分组散点图
    plt.subplot(2, 2, 4)
    groups = np.random.choice(['A', 'B', 'C'], n)
    colors_map = {'A': 'red', 'B': 'green', 'C': 'blue'}
    
    for group in ['A', 'B', 'C']:
        mask = groups == group
        plt.scatter(x1[mask], y1[mask], c=colors_map[group], 
                   label=f'组 {group}', alpha=0.7)
    
    plt.title('分组散点图')
    plt.xlabel('x')
    plt.ylabel('y')
    plt.legend()
    plt.grid(True, alpha=0.3)
    
    plt.tight_layout()
    plt.show()

def bar_plot_examples():
    """柱状图示例"""
    print("=== 柱状图示例 ===")
    
    plt.figure(figsize=(12, 8))
    
    # 子图1: 基本柱状图
    categories = ['产品A', '产品B', '产品C', '产品D', '产品E']
    values = [23, 45, 56, 78, 32]
    
    plt.subplot(2, 2, 1)
    bars = plt.bar(categories, values, color=['red', 'green', 'blue', 'orange', 'purple'])
    plt.title('基本柱状图')
    plt.ylabel('销量')
    plt.xticks(rotation=45)
    
    # 在柱子上添加数值标签
    for bar, value in zip(bars, values):
        plt.text(bar.get_x() + bar.get_width()/2, bar.get_height() + 1, 
                str(value), ha='center', va='bottom')
    
    # 子图2: 水平柱状图
    plt.subplot(2, 2, 2)
    plt.barh(categories, values, color='skyblue')
    plt.title('水平柱状图')
    plt.xlabel('销量')
    
    # 子图3: 分组柱状图
    plt.subplot(2, 2, 3)
    x = np.arange(len(categories))
    width = 0.35
    
    values1 = [20, 35, 30, 35, 27]
    values2 = [25, 25, 15, 30, 35]
    
    plt.bar(x - width/2, values1, width, label='2022年', color='lightblue')
    plt.bar(x + width/2, values2, width, label='2023年', color='lightcoral')
    
    plt.title('分组柱状图')
    plt.ylabel('销量')
    plt.xticks(x, categories, rotation=45)
    plt.legend()
    
    # 子图4: 堆叠柱状图
    plt.subplot(2, 2, 4)
    plt.bar(categories, values1, label='2022年', color='lightblue')
    plt.bar(categories, values2, bottom=values1, label='2023年', color='lightcoral')
    
    plt.title('堆叠柱状图')
    plt.ylabel('销量')
    plt.xticks(rotation=45)
    plt.legend()
    
    plt.tight_layout()
    plt.show()

def histogram_examples():
    """直方图示例"""
    print("=== 直方图示例 ===")
    
    plt.figure(figsize=(12, 8))
    
    # 生成测试数据
    np.random.seed(42)
    data1 = np.random.normal(0, 1, 1000)  # 标准正态分布
    data2 = np.random.normal(2, 1.5, 1000)  # 均值2，标准差1.5
    data3 = np.random.exponential(2, 1000)  # 指数分布
    
    # 子图1: 基本直方图
    plt.subplot(2, 2, 1)
    plt.hist(data1, bins=30, alpha=0.7, color='skyblue', edgecolor='black')
    plt.title('基本直方图 - 正态分布')
    plt.xlabel('值')
    plt.ylabel('频率')
    plt.grid(True, alpha=0.3)
    
    # 子图2: 多个分布对比
    plt.subplot(2, 2, 2)
    plt.hist(data1, bins=30, alpha=0.5, label='分布1', color='blue')
    plt.hist(data2, bins=30, alpha=0.5, label='分布2', color='red')
    plt.title('多分布对比')
    plt.xlabel('值')
    plt.ylabel('频率')
    plt.legend()
    plt.grid(True, alpha=0.3)
    
    # 子图3: 归一化直方图
    plt.subplot(2, 2, 3)
    plt.hist(data1, bins=30, density=True, alpha=0.7, color='green')
    plt.title('归一化直方图')
    plt.xlabel('值')
    plt.ylabel('概率密度')
    plt.grid(True, alpha=0.3)
    
    # 子图4: 累积直方图
    plt.subplot(2, 2, 4)
    plt.hist(data3, bins=30, cumulative=True, alpha=0.7, color='orange')
    plt.title('累积直方图 - 指数分布')
    plt.xlabel('值')
    plt.ylabel('累积频率')
    plt.grid(True, alpha=0.3)
    
    plt.tight_layout()
    plt.show()

def pie_chart_examples():
    """饼图示例"""
    print("=== 饼图示例 ===")
    
    plt.figure(figsize=(12, 8))
    
    # 数据
    labels = ['苹果', '香蕉', '橙子', '葡萄', '其他']
    sizes = [35, 25, 20, 15, 5]
    colors = ['gold', 'yellowgreen', 'lightcoral', 'lightskyblue', 'lightgray']
    
    # 子图1: 基本饼图
    plt.subplot(2, 2, 1)
    plt.pie(sizes, labels=labels, colors=colors, autopct='%1.1f%%')
    plt.title('基本饼图')
    
    # 子图2: 突出显示某一块
    explode = (0, 0.1, 0, 0, 0)  # 突出显示香蕉
    plt.subplot(2, 2, 2)
    plt.pie(sizes, explode=explode, labels=labels, colors=colors, 
            autopct='%1.1f%%', shadow=True, startangle=90)
    plt.title('突出显示饼图')
    
    # 子图3: 环形图
    plt.subplot(2, 2, 3)
    wedges, texts, autotexts = plt.pie(sizes, labels=labels, colors=colors, 
                                      autopct='%1.1f%%', pctdistance=0.85)
    
    # 创建中心空白
    centre_circle = plt.Circle((0,0), 0.70, fc='white')
    fig = plt.gcf()
    fig.gca().add_artist(centre_circle)
    plt.title('环形图')
    
    # 子图4: 自定义样式饼图
    plt.subplot(2, 2, 4)
    wedges, texts, autotexts = plt.pie(sizes, labels=labels, colors=colors,
                                      autopct='%1.1f%%', startangle=45,
                                      textprops={'fontsize': 10})
    
    # 美化百分比文字
    for autotext in autotexts:
        autotext.set_color('white')
        autotext.set_fontweight('bold')
    
    plt.title('自定义样式饼图')
    
    plt.tight_layout()
    plt.show()

def subplot_examples():
    """子图布局示例"""
    print("=== 子图布局示例 ===")
    
    # 示例1: 规则子图布局
    fig, axes = plt.subplots(2, 3, figsize=(15, 10))
    fig.suptitle('规则子图布局示例', fontsize=16)
    
    x = np.linspace(0, 2*np.pi, 100)
    
    # 填充子图
    functions = [
        (np.sin, 'sin(x)', 'red'),
        (np.cos, 'cos(x)', 'blue'),
        (np.tan, 'tan(x)', 'green'),
        (lambda x: np.sin(2*x), 'sin(2x)', 'orange'),
        (lambda x: np.cos(2*x), 'cos(2x)', 'purple'),
        (lambda x: np.exp(-x/5)*np.sin(x), 'exp(-x/5)sin(x)', 'brown')
    ]
    
    for i, (func, title, color) in enumerate(functions):
        row, col = i // 3, i % 3
        axes[row, col].plot(x, func(x), color=color, linewidth=2)
        axes[row, col].set_title(title)
        axes[row, col].grid(True, alpha=0.3)
        axes[row, col].set_xlim(0, 2*np.pi)
    
    plt.tight_layout()
    plt.show()

def customization_examples():
    """图形定制示例"""
    print("=== 图形定制示例 ===")
    
    # 创建数据
    x = np.linspace(0, 10, 100)
    y1 = np.sin(x)
    y2 = np.cos(x)
    
    plt.figure(figsize=(12, 8))
    
    # 绘制曲线
    line1, = plt.plot(x, y1, 'b-', linewidth=3, label='sin(x)')
    line2, = plt.plot(x, y2, 'r--', linewidth=3, label='cos(x)')
    
    # 定制坐标轴
    plt.xlim(0, 10)
    plt.ylim(-1.5, 1.5)
    plt.xlabel('X轴', fontsize=14, fontweight='bold')
    plt.ylabel('Y轴', fontsize=14, fontweight='bold')
    plt.title('定制图形示例', fontsize=16, fontweight='bold', pad=20)
    
    # 定制网格
    plt.grid(True, linestyle=':', alpha=0.7, color='gray')
    
    # 定制图例
    plt.legend(loc='upper right', fontsize=12, frameon=True, 
              fancybox=True, shadow=True)
    
    # 添加注释
    plt.annotate('交点', xy=(np.pi/4, np.sin(np.pi/4)), xytext=(2, 1),
                arrowprops=dict(arrowstyle='->', color='black', lw=2),
                fontsize=12, ha='center')
    
    # 添加文本
    plt.text(8, 1.2, '这是一个定制图形', fontsize=12, 
             bbox=dict(boxstyle="round,pad=0.3", facecolor="yellow", alpha=0.7))
    
    # 设置刻度
    plt.xticks(np.arange(0, 11, 2), fontsize=12)
    plt.yticks(np.arange(-1.5, 2, 0.5), fontsize=12)
    
    plt.tight_layout()
    plt.show()

def main():
    """主函数，运行所有基础绘图示例"""
    print("Matplotlib 基础绘图演示")
    print("=" * 50)
    
    # 运行所有示例
    line_plot_examples()
    scatter_plot_examples()
    bar_plot_examples()
    histogram_examples()
    pie_chart_examples()
    subplot_examples()
    customization_examples()
    
    print("\n基础绘图演示完成！")
    print("接下来可以查看其他示例文件：")
    print("- advanced_plots.py - 高级图表类型")
    print("- customization.py - 图形定制技巧")
    print("- 3d_plotting.py - 3D绘图")

if __name__ == "__main__":
    main() 